package cn.com.generaldata.os.service.indicator_evaluation.incr_analysis;

import org.apache.commons.lang3.Validate;
import org.nutz.dao.sql.Criteria;

import cn.com.generaldata.jsme_indicator_system.entity.IndicatorEvaluation;
import cn.com.generaldata.jsme_indicator_system.util.Constants;
import cn.com.generaldata.os.service.indicator_evaluation.IndicatorEvaluationCalculateService;
import cn.com.generaldata.os.vo.IndicatorAccountVO;

/**
 * 资本存量评估指标计算类.
 */
public class CapitalStockCalculateService extends IndicatorEvaluationCalculateService {

	/** 折旧率 */
	private final double depreciationRate = 0.1096d;

	private String capitalStockIndicatorName = "资本存量";

	private String fixedAssetsComparablePriceIndicatorName = "固定资本形成额可比价";

	/** 2001年基本资本存量 */
	private Double baseCapitalStock = 16862.25644d;

	@Override
	protected Double calculate(IndicatorEvaluation indicator, IndicatorAccountVO indicatorAccountVO) {
		Double result = null;
		if (indicator.getSection() == Constants.INDICATOR_LEVEL_PROVINCE) {
			result = calculateProvinceResult(indicator, indicatorAccountVO);
		} else if (indicator.getSection() == Constants.INDICATOR_LEVEL_CITY) {
			// 市指标没确定先保留
		}
		return result;
	}

	private Double calculateProvinceResult(IndicatorEvaluation indicator, IndicatorAccountVO indicatorAccountVO) {
		if (indicatorAccountVO.getYear() == 2001) {
			return baseCapitalStock;
		}
		Double lastCapitalStock = getLastCapitalStock(indicatorAccountVO);
		Validate.isTrue(lastCapitalStock != null);

		Double fixedAssetsComparablePrice = getFixedAssetsComparablePrice(indicatorAccountVO);
		Validate.isTrue(fixedAssetsComparablePrice != null);

		return (1 - depreciationRate) * lastCapitalStock + fixedAssetsComparablePrice;
	}

	/**
	 * 获得上期的资本存量.
	 * 
	 * @param indicatorAccountVO
	 * @return
	 */
	private Double getLastCapitalStock(IndicatorAccountVO indicatorAccountVO) {
		Integer indicatorId = getIndicatorEvaluationId(capitalStockIndicatorName, indicatorAccountVO.getAreaId());
		Criteria cri = getIndicatorDataCri(indicatorAccountVO, indicatorAccountVO.getYear() - 1, indicatorId);
		return getEvaluationIndicatorValue(cri);
	}

	/**
	 * 获取对应的固定资本形成额可比价
	 * 
	 * @param indicatorAccountVO
	 * @return
	 */
	private Double getFixedAssetsComparablePrice(IndicatorAccountVO indicatorAccountVO) {
		Integer indicatorId = getIndicatorEvaluationId(fixedAssetsComparablePriceIndicatorName,
				indicatorAccountVO.getAreaId());
		Criteria cri = getIndicatorDataCri(indicatorAccountVO, indicatorAccountVO.getYear(), indicatorId);
		return getEvaluationIndicatorValue(cri);
	}
}
